﻿using System.Text.Json.Serialization;

namespace wwl.Contract.Dtos.Common
{
  /// <summary>
  /// API接口通用返回模型
  /// 统一封装接口响应数据格式，包含状态码、消息、业务数据等，便于前端统一处理
  /// </summary>
  /// <typeparam name="T">业务数据类型（如租户DTO、分页结果等）</typeparam>
  public class ApiResponse<T>
  {
    /// <summary>
    /// 业务状态码（非HTTP状态码）
    /// 0表示成功，非0表示失败（可自定义具体错误码，如1001=参数错误，2001=权限不足等）
    /// </summary>
    [JsonPropertyName("code")]
    public int Code { get; set; }

    /// <summary>
    /// 响应消息
    /// 成功时可返回"操作成功"，失败时返回具体错误信息（如"租户编码已存在"）
    /// </summary>
    [JsonPropertyName("message")]
    public string Message { get; set; } = string.Empty;

    /// <summary>
    /// 业务数据
    /// 成功时返回具体数据（如租户详情、列表等），失败时可为null
    /// </summary>
    [JsonPropertyName("data")]
    public T? Data { get; set; }

    /// <summary>
    /// 操作时间戳（UTC时间）
    /// 便于前端记录操作时间或排查问题
    /// </summary>
    [JsonPropertyName("timestamp")]
    public long Timestamp { get; } = new DateTimeOffset(DateTime.UtcNow).ToUnixTimeMilliseconds();

    /// <summary>
    /// 构建成功响应（默认code=0，message="操作成功"）
    /// </summary>
    /// <param name="data">业务数据</param>
    /// <param name="message">自定义成功消息（可选）</param>
    /// <returns>成功响应模型</returns>
    public static ApiResponse<T> Success(T? data, string message = "操作成功")
    {
      return new ApiResponse<T>
      {
        Code = 0,
        Message = message,
        Data = data
      };
    }

    /// <summary>
    /// 构建失败响应（需指定错误码和错误消息）
    /// </summary>
    /// <param name="code">错误码（非0）</param>
    /// <param name="message">错误详情消息</param>
    /// <returns>失败响应模型</returns>
    public static ApiResponse<T> Fail(int code, string message)
    {
      return new ApiResponse<T>
      {
        Code = code,
        Message = message,
        Data = default
      };
    }
  }

  /// <summary>
  /// 无业务数据的API响应（用于不需要返回数据的场景，如删除操作）
  /// </summary>
  public class ApiResponse : ApiResponse<object>
  {
    /// <summary>
    /// 构建无数据的成功响应
    /// </summary>
    public static ApiResponse Success(string message = "操作成功")
    {
      return new ApiResponse
      {
        Code = 0,
        Message = message,
        Data = default
      };
    }

    /// <summary>
    /// 构建无数据的失败响应
    /// </summary>
    public static new ApiResponse Fail(int code, string message)
    {
      return new ApiResponse
      {
        Code = code,
        Message = message,
        Data = null
      };
    }
  }
}